package model;

import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

// CLASE QUE SE ENCARGA DE LA CREACION Y ELIMINACION DE FECHAS DE VUELOS
public class FechasDeVuelos {

    // metodo para revisar si se deben agregar mas fechas a los vuelos, y agregarlos en caso sea necesario
    // regla: si faltan 3 dias o menos para que se llegue a la ultima fecha de vuelo generada, generar 1 semana mas a partir de esa ultima fecha
    public static void agregarFechasAVuelos(Simulacion simulacion) {
        List<Arista> aristas = simulacion.getListaAristas();// obtener todas las aristas de la simulacion
        Date ultimaFechaCreacion = simulacion.getUltimaFechaCreacionVuelos(); 
        Calendar ultimaHoraCreacion = Calendar.getInstance();
        Calendar horaSimulacion = Calendar.getInstance();
        ultimaHoraCreacion.setTimeInMillis(ultimaFechaCreacion.getTime());
        
        Date fechaHoraSimulacion = simulacion.getFechaHoraSim(); //Saco la fecha de la simulación
        horaSimulacion.setTimeInMillis(fechaHoraSimulacion.getTime());
        //horaSimulacion.add(Calendar.DAY_OF_YEAR, -3);
        ultimaHoraCreacion.add(Calendar.DAY_OF_YEAR, -3);
        System.out.println("ultima creacion: " + simulacion.getUltimaFechaCreacionVuelos());

        //Si hay diferencia de 3 días en las fechas, entonces generaré los nuevos vuelos
        if (horaSimulacion.compareTo(ultimaHoraCreacion) == 0) {
            
            System.out.println("nuevas fechas");
            
            for (int i = 0; i < aristas.size(); i++) {
                Vuelo vuelo = aristas.get(i).getVuelo();
                Integer idVuelo = vuelo.getIdVuelo();
                
                //Agrego 7 nuevas fechas para cubrir la semana
                for (int j=0; j < 7; j++) {
                    //Aumento un día de vuelo
//                    Calendar calendar = Calendar.getInstance();
//                    calendar.setTime(fechaVuelo);
//                    calendar.add(Calendar.DATE, 1);
                    //Lleno para historial
                    //HistorialVueloId historialVueloID = new HistorialVueloId(idVuelo + j, calendar.getTime());
                    Calendar cal = Calendar.getInstance();
                    //cal.setTime(simulacion.getFechaHoraSim());
                    cal.setTime(simulacion.getUltimaFechaCreacionVuelos());
                    Calendar fechaVueloTemp = Calendar.getInstance();
                    fechaVueloTemp.setTime(vuelo.getHoraPartida());
                    cal.set(Calendar.HOUR_OF_DAY, fechaVueloTemp.get(Calendar.HOUR_OF_DAY));
                    cal.set(Calendar.MINUTE, fechaVueloTemp.get(Calendar.MINUTE));
                    cal.set(Calendar.SECOND, 0);
                    cal.set(Calendar.MILLISECOND, 0);
                    cal.add(Calendar.DAY_OF_YEAR, j);
                    HistorialVueloId historialVueloID = new HistorialVueloId(idVuelo, cal.getTime());
                    HistorialVuelo historialVuelo = new HistorialVuelo(historialVueloID, vuelo);
                    historialVuelo.setNumPaquetes(0);
                    historialVuelo.setPaquetes(new HashSet(0));
                    vuelo.getHistorialVuelos().add(historialVuelo);                    
                }
                Date fechaMayorVuelo = sacaMayorFechaVuelo(vuelo.getHistorialVuelos());
                simulacion.setUltimaFechaCreacionVuelos(fechaMayorVuelo);
            }
            // seteo nueva fecha de ultima creacio de vuelos
//            Calendar fechaSimulacion = Calendar.getInstance();
//            fechaSimulacion.setTime(simulacion.getUltimaFechaCreacionVuelos());
//            fechaSimulacion.add(Calendar.DAY_OF_WEEK, j);
//            simulacion.setUltimaFechaCreacionVuelos(fechaSimulacion.getTime());
            
            
        }

        //Actualiza la ultima fecha
        //simulacion.setUltimaFechaCreacionVuelos(simulacion.getFechaHoraSim());
    }

    // metodo para revisar si se deben eliminar fechas de los vuelos, y eliminarlos en caso sea necesario
    // // regla: si la ultima fecha en que se borraron vuelos fue hace 7 dias, borro vuelos desde esa fecha hasta 5 dias despues
    public static void eliminarFechasAVuelos(Simulacion simulacion) {
        List<Arista> aristas = simulacion.getListaAristas(); // obtener todas las aristas de la simulacion
        Date ultimaFechaBorrado = simulacion.getUltimaFechaBorradoVuelos();
        Calendar ultimaHoraCreacion = Calendar.getInstance();
        Calendar horaSimulacion = Calendar.getInstance();
        ultimaHoraCreacion.setTimeInMillis(ultimaFechaBorrado.getTime());
        
        Date fechaHoraSimulacion = simulacion.getFechaHoraSim(); //Saco la fecha de la simulación
        horaSimulacion.setTimeInMillis(fechaHoraSimulacion.getTime());
        horaSimulacion.add(Calendar.DATE, -7);

        //Si hay diferencia de 7 días en las fechas, entonces borraré los vuelos
        if (horaSimulacion.compareTo(ultimaHoraCreacion) <= 0) {
            //Borro historial de vuelos hasta 5 días después de la ultima fecha de Borrado
            for (int i = 0; i < aristas.size(); i++){
                Vuelo vuelo = aristas.get(i).getVuelo();
                Set historialVuelos = vuelo.getHistorialVuelos();
                Iterator<HistorialVuelo> iteratorHistorialVuelo = historialVuelos.iterator();
                
                while (iteratorHistorialVuelo.hasNext()){
                    HistorialVuelo historialVuelo = iteratorHistorialVuelo.next();
                    Date fecha = historialVuelo.getId().getFecha();
                    
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(ultimaFechaBorrado);
                    calendar.add(Calendar.DATE, 5);
                    // Remover Historial Vuelo dentro de los 5 días despúes de la ultima Fecha de Borrado
                    if (calendar.getTime().compareTo(fecha) >= 0){
                        iteratorHistorialVuelo.remove();
                    }
                }
            }
        }

        //Actualiza la ultima fecha
        simulacion.setUltimaFechaBorradoVuelos(simulacion.getFechaHoraSim());
    }

    private static Date sacaMayorFechaVuelo(Set historialVuelos) {
        
        Date mayorFecha = new Date(0);
        
        Iterator<HistorialVuelo> iteratorHistorialVuelo = historialVuelos.iterator();
        
        while (iteratorHistorialVuelo.hasNext()){
            HistorialVuelo historialVuelo = iteratorHistorialVuelo.next();
            Date fecha = historialVuelo.getId().getFecha();
            if (mayorFecha.compareTo(fecha) < 0){
                mayorFecha = fecha;
            }     
        }
        
        return mayorFecha;
    }

    public static void GenerarAnho(Simulacion simulacion) {
        List<Arista> aristas = simulacion.getListaAristas();
            for (int i = 0; i < aristas.size(); i++) {
                Vuelo vuelo = aristas.get(i).getVuelo();
                Integer idVuelo = vuelo.getIdVuelo();
                
                //Agrego 1 anho a esa fecha
                for (int j=0; j < 365; j++) {
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(simulacion.getFechaHoraSim());
                    Calendar fechaVueloTemp = Calendar.getInstance();
                    fechaVueloTemp.setTime(vuelo.getHoraPartida());
                    cal.set(Calendar.HOUR_OF_DAY, fechaVueloTemp.get(Calendar.HOUR_OF_DAY));
                    cal.set(Calendar.MINUTE, fechaVueloTemp.get(Calendar.MINUTE));
                    cal.set(Calendar.SECOND, 0);
                    cal.set(Calendar.MILLISECOND, 0);
                    cal.add(Calendar.DAY_OF_YEAR, j);
                    HistorialVueloId historialVueloID = new HistorialVueloId(idVuelo, cal.getTime());
                    HistorialVuelo historialVuelo = new HistorialVuelo(historialVueloID, vuelo);
                    historialVuelo.setNumPaquetes(0);
                    vuelo.getHistorialVuelos().add(historialVuelo);   
                    
                }
            }
            
            
    }
    
    
    public static void GenerarMeses(Simulacion simulacion, int meses) {
        List<Arista> aristas = simulacion.getListaAristas();
            for (int i = 0; i < aristas.size(); i++) {
                Vuelo vuelo = aristas.get(i).getVuelo();
                Integer idVuelo = vuelo.getIdVuelo();
                
                //Agrego 1 anho a esa fecha
                for (int j=0; j < 30*meses; j++) {
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(simulacion.getFechaHoraSim());
                    Calendar fechaVueloTemp = Calendar.getInstance();
                    fechaVueloTemp.setTime(vuelo.getHoraPartida());
                    cal.set(Calendar.HOUR_OF_DAY, fechaVueloTemp.get(Calendar.HOUR_OF_DAY));
                    cal.set(Calendar.MINUTE, fechaVueloTemp.get(Calendar.MINUTE));
                    cal.set(Calendar.SECOND, 0);
                    cal.set(Calendar.MILLISECOND, 0);
                    cal.add(Calendar.DAY_OF_YEAR, j);
                    HistorialVueloId historialVueloID = new HistorialVueloId(idVuelo, cal.getTime());
                    HistorialVuelo historialVuelo = new HistorialVuelo(historialVueloID, vuelo);
                    historialVuelo.setNumPaquetes(0);
                    vuelo.getHistorialVuelos().add(historialVuelo);   
                    
                }
            }
            
            
    }

}
